/* ========================================
 *
 * Copyright Nano IC, 2021-02-25
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF Nano IC.
 *
 * ========================================
*/
#ifndef  __ONE_WIRE_BUS_QUEUE_H__
#define  __ONE_WIRE_BUS_QUEUE_H__
#include <stdbool.h>
#include <stdint.h>

#define BLOCK_QUEUE_MAX_SIZE            8
// 要求比实际长度大2 byte
#define ONE_BLOCK_QUEUE_MAX_LENGTH      253

typedef struct block_queue
{
    uint8_t *qu[BLOCK_QUEUE_MAX_SIZE];  // 用来存储队列中块数据指针
    uint16_t head;                           // 队列头
    uint16_t tail;                           // 队尾
    uint16_t block_avail_number;             // 队列中已有数据长度
    uint16_t one_block_len;                  // 一块队列长度
    uint16_t block_total_num;                // 队列总块数
}BlockQueueStruct;

typedef struct FlagBody 
{
	uint8_t protocolVersion: 4;
	uint8_t needRenoteAck: 1;
	uint8_t isRTisg: 1;
	uint8_t isAckmsg: 1;
	uint8_t sendSource: 1;
	uint8_t reserved:8;
}flagbody;
/**
 * @brief :块状队列的初始化
 * 
 * @param q: 块状队列控制数据结构
 * @param p_buf :块状队列数据保缓冲指针
 * @param one_bolck_len : 每一个块状队列的长度，块状队列每块固定长度，头两个字节表示总长度
 * @param total_block_num : 块状队列的总数量
 * @return true :成功
 * @return false :失败
 */
bool block_queue_create(BlockQueueStruct *q , uint8_t *p_buf ,uint16_t one_bolck_len , uint16_t total_block_num);

/**
 * @brief :向块状队列中写入一块数据
 * 
 * @param q: 块状队列控制数据结构
 * @param p_array : 需要写入的数据指针
 * @param len : 需要写入的数据长度
 * @param f_irq_dis : 操作过程中是否关闭中断
 * @return true :成功
 * @return false :失败
 */
bool block_queue_write(BlockQueueStruct *q , uint8_t *p_array , uint16_t len , bool f_irq_dis);

/**
 * @brief :从块状队列中读出一块数据
 * 
 * @param q: 块状队列控制数据结构
 * @param p_array : 需要读出的数据指针
 * @param len : 需要读出的数据长度
 * @param f_irq_dis : 操作过程中是否关闭中断
 * @return true :成功
 * @return false :失败
 */
uint16_t block_queue_read(BlockQueueStruct *q, uint8_t *p_array , uint16_t buf_len , bool f_irq_dis);

/**
 * @brief :向块状队列的头部写入一块数据,会被优先读取
 *         一般用于应答包，优先填入队列
 * 
 * @param q: 块状队列控制数据结构
 * @param p_array : 需要写入的数据指针
 * @param len : 需要写入的数据长度
 * @param f_irq_dis : 操作过程中是否关闭中断
 * @return true :成功
 * @return false :失败
 */
bool block_queue_write_urgent(BlockQueueStruct *q , uint8_t *p_array , uint16_t len , bool f_irq_dis);

/**
 * @brief :若队列非空，下一个将要读取块的数据长度
 * 
 * @param q: 块状队列控制数据结构
 * @return uint16_t: 将要读取块的长度
 */
uint16_t block_queue_next_block_length(BlockQueueStruct *q);

/**
 * @brief :判断队列是否为空
 * 
 * @param q: 块状队列控制数据结构
 * @return true : 队列空
 * @return false :非空
 */
bool block_queue_is_empty(BlockQueueStruct *q);

/**
 * @brief :判断队列是否为满
 * 
 * @param q: 块状队列控制数据结构
 * @return true : 队列满
 * @return false :未满
 */
bool block_queue_is_full(BlockQueueStruct *q);

/**
 * @brief :获取块状队列中，当前有多少块数据
 * 
 * @param q: 块状队列控制数据结构
 * @return 块数量
 */
uint16_t block_queue_cur_block_number(BlockQueueStruct *q);
    
#endif
/* [] END OF FILE */
